package com.jinxiangyang.service.impl;

import com.jinxiangyang.domain.vo.CacheVo;
import com.jinxiangyang.service.CacheService;
import com.jinxiangyang.utils.config.RedisCache;
import com.jinxiangyang.utils.result.AjaxResult;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * @author jinxiangyang
 * @date 2023/8/19 12:36
 * @description TODO
 **/


@Service
public class CacheServiceImpl implements CacheService {



    @Autowired
    private RedisCache redisCache;




    @Override
    public AjaxResult cacheValueCreate(CacheVo vo) {
        String type = vo.getDataType();
        if ("string".equals(type)) {
            redisCache.setCacheObject(vo.getRedisKey(), vo.getRedisValue());
        } else if ("list".equals(type)) {
            ArrayList<Object> objects = new ArrayList<>();
            objects.add(vo.getRedisValue());
            redisCache.setCacheList(vo.getRedisKey(),objects);
        }else if ("hash".equals(type)) {
            if (StringUtils.isNotBlank(redisCache.getCacheMapValue(vo.getRedisKey(), vo.getRedisHKey()))) {
                HashMap<String, Object> objectHashMap = new HashMap<>();
                objectHashMap.put(vo.getRedisHKey(),vo.getRedisValue());
                redisCache.setCacheMap(vo.getRedisKey(), objectHashMap);
            } else {
                redisCache.setCacheMapValue(vo.getRedisKey(), vo.getRedisHKey(), vo.getRedisValue());
            }
        }
        if(redisCache.redisTemplate.hasKey(vo.getRedisKey())){
            return AjaxResult.success();
        }
        return AjaxResult.error();
    }


    @Override
    public AjaxResult cacheValueDelete(CacheVo vo) {

        boolean exists = redisCache.redisTemplate.hasKey(vo.getRedisKey());
        if (exists) {
            Boolean count = false;
            if ("string".equalsIgnoreCase(vo.getDataType())) {
                count = redisCache.redisTemplate.delete(vo.getRedisKey());
            } else if ("hash".equals(vo.getDataType())) {
                if (StringUtils.isNotBlank(vo.getRedisKey()) && StringUtils.isNotBlank(vo.getRedisValue())) {
                    count = redisCache.deleteCacheMapValue(vo.getRedisKey(), vo.getRedisHKey());
                } else {
                    Map<String, String> hgetAll = redisCache.getCacheMap(vo.getRedisKey());
                    if (hgetAll != null && hgetAll.size() > 0) {
                        for (String hk : hgetAll.keySet()) {
                            count= redisCache.deleteCacheMapValue(vo.getRedisKey(), hk);
                        }
                    }
                }
            } else if ("list".equals(vo.getDataType()) && (StringUtils.isNotBlank(vo.getRedisValue()))) {
                count = redisCache.deleteObject(vo.getRedisKey());
            }
            if (count) {
                return AjaxResult.success();
            }
        }
        return AjaxResult.error("删除失败");
    }

}
